Database management systems use transactions to do work in a dependable manner. A transaction is a unit of work—a coordinated sequence of operations—that allows applications to reliably update the state of the system independently of any other operations that may be taking place at the same time.
Distributed systems (such as database clusters), which are physically distributed across several machines, use distributed transactions to update the state of the overall system. Distributed transactions involve multiple participants, which comprise the distributed parts of the system responsible for persisting changes to data. For a distributed transaction to succeed, the participants must achieve consensus about its outcome.
To date, distributed transactions have tended to use a strict two-phase commit approach, which requires that all the parts of the system containing the state to be updated participate in the transaction and agree on its outcome. Strict two-phase commit ensures write-consistent behavior and avoids corrupting data, but at the expense of liveness. Liveness in a distributed system is a measure of the system's ability to complete transactions, whether successfully or unsuccessfully. Strict two-phase commit approaches reduce a system's liveness because of the overhead of coordinating all the participants in the transaction, thereby limiting the system's scalability and practicality. In consequence, database clusters that use strict two-phase commit approaches tend to be relatively small—on the order of single digit machines.
To date, methods also exist for carrying out distributed transactions in such a way that preserves liveness at the expense of the integrity of the data. Such methods are termed to be “eventually consistent”, and generally speaking do not ensure consistency at write time. The significant disadvantage of such methods is that machines not participating in the update are liable to diverge, and over time, in a live system, end up with corrupt data. This is particularly true in cases where the data is connected rather than simply stored as discrete keys and values.